package com.wuchao.hive.udf;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

/**
 * 作者：吴超
 * 邮箱：wuchao_19931120@163.com
 * 时间：2021-04-18
 * 描述：
 */

public class MyLength extends GenericUDF {

    /**
     * 初始化方法，里面要做三件事：
     * 1.约束传入参数的个数
     * 2.约束传入参数的类型
     * 3.约束返回值的类型
     * @param arguments
     * @return
     * @throws UDFArgumentException
     */
    @Override
    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {

        // 1.约束传入参数的个数
        if (arguments.length != 1) {
            throw new UDFArgumentLengthException("Please input one args...");
        }

        // 2.约束传入参数的类型
        if (!arguments[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)) {
            throw new UDFArgumentTypeException(0,"Input args type error...");
        }

        // 3.约束返回值的类型
        return PrimitiveObjectInspectorFactory.javaIntObjectInspector;
    }

    /**
     *
     * @param arguments
     * @return
     */
    @Override
    public Object evaluate(DeferredObject[] arguments) throws HiveException {

        //获取函数传入的参数值
        Object o = arguments[0].get();
        //将object转换为字符串
        int length = o.toString().length();
        return length;
    }

    /**
     * 返回显示字符串方法，这个方法不用管，直接返回一个空字符串
     * @param children
     * @return
     */
    @Override
    public String getDisplayString(String[] children) {
        return "";
    }
}
